package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.anno.CacheFind;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

/**
 * @auther Zangyiyi
 * @date 2020/7/7 - 17:06
 */
@Service
public class ItemCatServiceImpl implements ItemCatService{

    @Autowired
    private ItemCatMapper itemCatMapper;
    //spring容器初始化时,该注解不是必须注入,但是如果程序调用则必须有值.
    @Autowired(required = false)
    private Jedis jedis;

    @Override
    public ItemCat findItemCatFromMapper(Long itemCatId) {
        return itemCatMapper.selectById(itemCatId);
    }

    @Override
    @CacheFind(key="ITEM_CAT_LIST",seconds = 100)//约定:将变量放到第一位  spel表达式
    public List<EasyUITree> findItemCatTreeByParentIdFromMapper(Long parentId) {
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
        queryWrapper.eq("parent_id" , parentId);
        List<ItemCat> itemCatList = itemCatMapper.selectList(queryWrapper);
        List<EasyUITree> easyUITreeList = new ArrayList<EasyUITree>();
        //将数据库记录转化为VO数据
        for(ItemCat itemCat:itemCatList){
            EasyUITree easyUITree = new EasyUITree(itemCat.getId(), itemCat.getName(), itemCat.getIsParent()?"closed":"open");
            easyUITreeList.add(easyUITree);
        }
        return easyUITreeList;
    }

    /**
     * 通过缓存的方式查询数据库.
     * 1.)定义key
     * 2.)根据key查询redis.
     * @param parentId
     * @return
     */
    @Override
    public List<EasyUITree> findItemCatByCache(Long parentId) {
        //1.定义key
        String key = "ITEM_CAT_LIST::"+parentId;
        List<EasyUITree> treeList = new ArrayList<EasyUITree>();
        Long startTime = System.currentTimeMillis();
        //2.判断redis中是否有值
        if (jedis.exists(key)){
            //不是第一次查询,则获取缓存数据之后直接返回
            String json = jedis.get(key);
            treeList =
            ObjectMapperUtil.toObject(json,treeList.getClass());
            long endTime = System.currentTimeMillis();
            System.out.println("redis查询缓存的时间:"+(endTime-startTime)+"毫秒");
        }else{
            //redis中没有这个key,表示用户第一次查询.
            treeList = findItemCatTreeByParentIdFromMapper(parentId);
            //需要将list集合转化为json
            String json = ObjectMapperUtil.toJSON(treeList);
            System.out.println("数据库输出");

            //将数据保存到redis中
            jedis.set(key,json);
        }

        return treeList;
    }
}
